﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using CurrencyConverter.IndicadorEconomicoBCCR;

namespace CurrencyConverter
{
    /// <summary>
    /// Clase que se encarga de convertir entre 2 monedas.
    /// </summary>
    public class Converter
    {

        public Converter()
        {

        }

        /// <summary>
        /// Metodo que permite obtener el tipo de cambio del dolar del dia actual
        /// </summary>
        /// <param name="nombreUsuario">Nombre del usuario que realiza la consulta</param>
        /// <param name="email">Email del usuario que realiza la consulta</param>
        /// <param name="tipodeCambio">Indica que tipo de cambio se requiere, true para compra, false para venta</param>
        /// <returns>Retorna el valor del tipo de cambio de dolar a colones del dia</returns>
        public double TipoCambioDolar(String nombreUsuario, String email, bool tipodeCambio)
        {
            var currency = new CurrencyExtractor();
            try
            {
                var fecha = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
                var nombreUsuarioConsulta = string.Format("{0} {1}", nombreUsuario, email);
                var compraNeeded = tipodeCambio ? Constantes.TipoCambioCompra : Constantes.TipoCambioVenta;
                var tipoCambioDia = currency.ObtenerTipoCambio(compraNeeded, fecha, fecha, nombreUsuarioConsulta, false);

                DataRow dataRow = tipoCambioDia.Tables[0].Rows[0];
                var res = double.Parse(dataRow.ItemArray.GetValue(2).ToString());
                return res;
            }
            catch (Exception)
            {
                return 0.0;
            }
        }

        /// <summary>
        /// Metodo que permite saber el tipo de cambio de alguna moneda con respecto al dolar
        /// </summary>
        /// <param name="monedaOrigen">Codigo de la moneda de origen de la cual se desea saber el tipo de cambio</param>
        /// <param name="monedaDestino">Codigo de la moneda destino la cual sera transformada</param>
        /// <param name="nombreUsuario">Nombre del usuario que realiza la consulta</param>
        /// <param name="email">email del usuario que realiza la consulta</param>
        public double TipoCambio(string monedaOrigen, string monedaDestino, String nombreUsuario, String email)
        {
            var currency = new CurrencyExtractor();
            try
            {
                // Si se pide de colones a dolares
                if (monedaOrigen == Constantes.TipoCambioColones && monedaDestino == Constantes.TipoCambioDolar)
                {
                    return TipoCambioDolar(nombreUsuario, email, true);
                }

                var fecha = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
                var nombreUsuarioConsulta = string.Format("{0} {1}", nombreUsuario, email);

                // cantidad en dolares de la moneda origen
                var tipoCambioRespectoDolar = currency.ObtenerTipoCambio(monedaOrigen, fecha, fecha, nombreUsuarioConsulta, false);
                DataRow dataRow = tipoCambioRespectoDolar.Tables[0].Rows[0];
                var cantDolaresOrigen = double.Parse(dataRow.ItemArray.GetValue(2).ToString());

                // cantidad en dolares de la moneda destino
                var cantDolaresDestino = 1.0;
                if (monedaDestino != Constantes.TipoCambioDolar)
                {
                    tipoCambioRespectoDolar = currency.ObtenerTipoCambio(monedaDestino, fecha, fecha,
                                                                         nombreUsuarioConsulta, false);
                    dataRow = tipoCambioRespectoDolar.Tables[0].Rows[0];
                    cantDolaresDestino = double.Parse(dataRow.ItemArray.GetValue(2).ToString());
                }
                // saca el valor de la conversion
                var res = cantDolaresDestino / cantDolaresOrigen;

                return res;
            }
            catch (Exception)
            {
                return 0.0;
            }
        }

    }
}
